;*****************************************************************************************************
;+
; NAME:
;       CATSETDEFAULT
;
; PURPOSE:
;
;       This function enables the caller to set existing system settings. The intention
;       is to hide the mechanics of default storage from the caller.
;
; AUTHORS:
;
;        FANNING SOFTWARE CONSULTING   BURRIDGE COMPUTING
;        1645 Sheely Drive             18 The Green South
;        Fort Collins                  Warborough, Oxon
;        CO 80526 USA                  OX10 7DN, ENGLAND
;        Phone: 970-221-0438           Phone: +44 (0)1865 858279
;        E-mail: davidf@dfanning.com   E-mail: davidb@burridgecomputing.co.uk
;
; CATEGORY:
;
;       Programming.
;
; CALLING SEQUENCE:
;
;       CatSetDefault, name, value
;
; ARGUMENTS:
;
;        name:        A string by which this value will be "known" to the system.
;
;        value:       An IDL variable that will be associated with the defaultName.
;                     Can be any type of IDL variable.
;
; KEYWORDS:
;
;        DESTROY_ON_CLEANUP: If this keyword is set, then the value is destoyed by calling
;                      the UNDEFINE command, whenever the Catalyst object that stores the
;                      value is destroy. Othersize, a simple storage location is provided,
;                      and the storage object takes no interest whatsoever in the IDL variable
;                      that is stored there. If this variable is a heap variable, or an IDL
;                      variable containing a heap variable, you will be responsible for destroying
;                      the variable, unless this keyword is set on initialization.
;
; MODIFICATION_HISTORY:
;
;       Written by: David Burridge, 12th March 2003
;-
;******************************************************************************************;
;  Copyright (c) 2008, jointly by Fanning Software Consulting, Inc.                        ;
;  and Burridge Computing. All rights reserved.                                            ;
;                                                                                          ;
;  Redistribution and use in source and binary forms, with or without                      ;
;  modification, are permitted provided that the following conditions are met:             ;
;                                                                                          ;
;      * Redistributions of source code must retain the above copyright                    ;
;        notice, this list of conditions and the following disclaimer.                     ;
;      * Redistributions in binary form must reproduce the above copyright                 ;
;        notice, this list of conditions and the following disclaimer in the               ;
;        documentation and/or other materials provided with the distribution.              ;
;      * Neither the name of Fanning Software Consulting, Inc. or Burridge Computing       ;
;        nor the names of its contributors may be used to endorse or promote products      ;
;        derived from this software without specific prior written permission.             ;
;                                                                                          ;
;  THIS SOFTWARE IS PROVIDED BY FANNING SOFTWARE CONSULTING, INC. AND BURRIDGE COMPUTING   ;
;  ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE     ;
;  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE          ;
;  DISCLAIMED. IN NO EVENT SHALL FANNING SOFTWARE CONSULTING, INC. OR BURRIDGE COMPUTING   ;
;  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL    ;
;  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;    ;
;  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND             ;
;  ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT              ;
;  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS           ;
;  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.                            ;
;******************************************************************************************;
PRO CatSetDefault, defaultName, value, Destroy_on_Cleanup=destroy_on_cleanup, Success=success

   COMMON __$CatDefaults$_, defaultsObj

   ; Set up error handling
   CATCH, error
   IF (error NE 0) THEN $
   BEGIN
      HELP, /Last
      RETURN
   ENDIF
   success = 0B

   ; If no defaults container object exists, create one
   IF (NOT OBJ_VALID (defaultsObj)) THEN defaultsObj = OBJ_NEW ('CatList')

   ; If the variable does not exist, take the appropriate action
   existing = defaultsObj -> Get (defaultName)
   IF (OBJ_VALID (existing)) $
       THEN existing -> SetValue, value, Destroy_on_Cleanup=destroy_on_cleanup, Success=success $
       ELSE defaultsObj -> Add, defaultName, Destroy_on_Cleanup=destroy_on_cleanup, Value=value

   success = 1B

END

